using System;
using System.Collections;

namespace Curriculum.Business.Clases {
	public class Antecedente : ICloneable
	{

		private Antecedente[] _antecedentes;
		private Atributo[] _atributos;
		private string _idAntecedente;
		private string _idPadre;
		private string _nombre;
		private bool _agregacion;

		public Antecedente(){
	
		}

		public Antecedente[] Antecedentes	
		{
			get{ return _antecedentes;}
			set{ _antecedentes = value;}
		}
		public Atributo[] Atributos	
		{
			get{ return _atributos;}
			set{ _atributos = value;}
		}
		public string IdAntecente
		{
			get{ return _idAntecedente;}
			set{ _idAntecedente = value;}
		}
		public string IdPadre
		{
			get{ return _idPadre;}
			set{ _idPadre = value;}
		}
		public string Nombre
		{
			get{ return _nombre;}
			set{ _nombre = value;}
		}
		public bool EsAgregacion
		{
			get{ return _agregacion;}
			set{ _agregacion = value;}
		}

		public object Clone()
		{
			Antecedente antecedenteCopia = new Antecedente();

			if (this.Antecedentes != null)
				antecedenteCopia.Antecedentes = (Antecedente[])this.Antecedentes.Clone();
			if (this.Atributos != null)
				antecedenteCopia.Atributos = (Atributo[])this.Atributos.Clone();
			
			antecedenteCopia.EsAgregacion = this.EsAgregacion;
			antecedenteCopia.IdAntecente  = this.IdAntecente;
			antecedenteCopia.IdPadre = this.IdPadre;
			antecedenteCopia.Nombre	 = this.Nombre;

			return antecedenteCopia;
		}

		public bool TieneEstructuraCompatible(object obj)
		{
			Antecedente antecedente = (Antecedente)obj;

			if (this.Atributos.Length != antecedente.Atributos.Length)
				return false;
			
			// ordeno los atributos para que esten en el mismo orden
			OrdenarAtributos(antecedente.Atributos, antecedente.Atributos.Length-1, 0);
			OrdenarAtributos(this.Atributos, this.Atributos.Length-1, 0);

			// comparo atributos
			for (int indice = 0; indice < this.Atributos.Length; indice++)
			{
				if (!this.Atributos[indice].Equals(antecedente.Atributos[indice]))	
					return false;
			}
			
			// comparo atributos de los hijos.
			if (this.Antecedentes != null)
			{
				if ((antecedente.Antecedentes == null) ||
					(this.Antecedentes.Length != antecedente.Antecedentes.Length))
				{
					return false;
				}
				else
				{
					return this.Antecedentes[0].TieneEstructuraCompatible(antecedente.Antecedentes[0]);
				}
			}

			return true;
		}

		private void OrdenarAtributos(Atributo[] atributos, int indSup, int indInf)
		{
			int max = atributos.Length;
			Atributo temp;

			for (int i = 0; i < max; i++)
				for (int j = 0; j < max-1; j++) 
				{
					if ( int.Parse(atributos[j].IdAtributo) > int.Parse(atributos[j+1].IdAtributo))
					{	
						temp = atributos[j];
						atributos[j] = atributos[j+1];
						atributos[j+1] = temp;
					}
				}
		}


	}//end Antecedente

}//end namespace Data Model